#ifndef OPTIONS__
#define OPTIONS__

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

#include "base.h"
#include "ticpp/ticpp.h"

/** Zakladni trida pro nacitani nastaveni ze vstupniho souboru.
 * Poskytuje virtualni funkce, ktere je nutne predefinovat, zejmena Read() a Print(),
 * dale poskytuje pristup k logovacimu souboru a umoznuje na displeji zobrazovat informace o
 * aktualnim prubehu vypoctu.
 */
class Options {
public:
	/** Defaultni konstruktor.
	 * \param log otevreny stream k logovacimu souboru
	 */
	Options(std::ostream * log): log(log), detail(0), displayed_len(0), displayer_available(false), display(true), displayer(NULL) {}
	/** Destruktor - bez prace.
	 */
	virtual ~Options() {};
	virtual void Print();
	virtual void Read(ticpp::Element * settings);
	void Display(const std::string & text);
	void NewDisplay();

	void NextTest(bool ok = true);
	void TestCount(int count);

	/** Vraci stream k logovacimu souboru.
	 * \result logovaci stream
	 */
	std::ostream & Log() {
		return *log;
	}

	void SetDisplayObject(ProgressDisplayer * displayer);
	void SetDisplayAvailability(bool available);

	/** Zmeni logovaci soubor.
	 * \param log stream k logovacimu souboru
	 */
	void SetLog(std::ostream * log) {
		this->log = log;
	}

	std::ostream * log; ///< ukazatel na stream k logovacimu souboru
	int detail; ///< polozka k vyuziti zdedenymi tridami
private:
	size_t displayed_len; ///< delka naposledy zobrazene zpravy
	bool displayer_available; ///< dostupnost zobrazovace informaci
	bool display; ///< je zapnute zobrazovani informaci na displej
	ProgressDisplayer * displayer; ///< zobrazovac aktualnich informaci o prubehu vypoctu. Vyuziti z pripadneho GUI, kdy neni pozadovane zobrazovat informace na displeji ale v okne.
};

#endif
